/*
 * Solo - A small and beautiful blogging system written in Java.
 * Copyright (c) 2010-present, b3log.org
 *
 * Solo is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *         http://license.coscl.org.cn/MulanPSL2
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 */
/**
 * @fileoverview editor
 *
 * @author <a href="http://vanessa.b3log.org">Liyuan Li</a>
 * @author <a href="http://88250.b3log.org">Liang Ding</a>
 * @version 1.6.0.2, Jul 11, 2020
 */
admin.editors = {}

/*
 * @description Create SoloEditor can use all editor.
 * @constructor
 * @param conf 编辑器初始化参数
 * @param conf.id 编辑器渲染元素 id
 * @param conf.height 编辑器种类
 */
window.SoloEditor = function (conf) {
    this.conf = conf
    this.init()
}

$.extend(SoloEditor.prototype, {
    /*
     * @description 初始化编辑器
     */
    init: function () {

        // 编辑器常用表情使用社区端的设置
        $.ajax({
            url: 'https://ld246.com/apis/vcomment/users/emotions',
            type: 'GET',
            cache: true,
            async: false,
            xhrFields: {
                withCredentials: true,
            },
            success: function (result) {
                Label.emoji = {}
                if (Array.isArray(result.data)) {
                    result.data.forEach(item => {
                        const key = Object.keys(item)[0]
                        Label.emoji[key] = item[key]
                    })
                }
            },
        })

        const options = {
            cdn: Label.staticServePath + "/js/lib/vditor",
            outline: this.conf.outline || {enable: false},
            mode: Label.editorMode,
            typewriterMode: this.conf.typewriterMode,
            cache: {
                enable: true,
            },
            tab: '\t',
            preview: {
                delay: 500,
                mode: this.conf.previewMode,
                url: Label.servePath + '/console/markdown/2html',
                hljs: {
                    enable: !Label.luteAvailable,
                    style: Label.hljsStyle,
                },
                theme: {
                    path: Label.staticServePath + "/js/lib/vditor/dist/css/content-theme"
                },
                parse: function (element) {
                    if (element.style.display === 'none') {
                        return
                    }
                },
            },
            upload: {
                max: 10 * 1024 * 1024,
                url: Label.uploadURL,
                linkToImgUrl: Label.servePath + '/upload/fetch',
                token: Label.uploadToken,
                filename: function (name) {
                    return name.replace(/[^(a-zA-Z0-9\u4e00-\u9fa5\.)]/g, '').replace(/[\?\\/:|<>\*\[\]\(\)\$%\{\}@~]/g, '').replace('/\\s/g', '')
                },
            },
            height: this.conf.height,
            counter: {
                enable: true,
                max: 102400,
            },
            resize: {
                enable: this.conf.resize,
            },
            lang: Label.localeString,
            hint: {
                emojiTail: `<a href="https://ld246.com/settings/function" target="_blank">设置常用表情</a>`,
                emoji: Label.emoji,
                emojiPath: Label.staticServePath + "/js/lib/vditor/dist/images/emoji"
            },
            toolbarConfig: {
                pin: true,
            },
            toolbar: [
                "emoji",
                "headings",
                "bold",
                "link",
                "|",
                "list",
                "ordered-list",
                "check",
                "outdent",
                "indent",
                "|",
                "quote",
                "code",
                "insert-before",
                "insert-after",
                "|",
                "upload",
                "record",
                "table",
                "|",
                "undo",
                "redo",
                "|",
                "fullscreen",
                "edit-mode",
                {
                    name: "more",
                    toolbar: [
                        "italic",
                        "strike",
                        "line",
                        "inline-code",
                        "both",
                        "code-theme",
                        "content-theme",
                        "export",
                        "outline",
                        "preview",
                        "devtools",
                        "info",
                        "help",
                    ],
                }],
            after: () => {
                if (typeof this.conf.fun === 'function') {
                    this.conf.fun()
                }
            },
        }

        if ($(window).width() < 768) {
            options.toolbar = [
                'emoji',
                'link',
                'upload',
                'edit-mode',
                {
                    name: 'more',
                    toolbar: [
                        'insert-after',
                        'fullscreen',
                        'preview',
                        'info',
                        'help',
                    ],
                },
            ]
            options.resize.enable = false
            options.toolbarConfig.pin = true
        }

        this.editor = new Vditor(this.conf.id, options)
    },
    /*
     * @description 获取编辑器值
     * @returns {string} 编辑器值
     */
    getContent: function () {
        return this.editor.getValue()
    },
    /*
     * @description 设置编辑器值
     * @param {string} content 编辑器回填内容
     */
    setContent: function (content) {
        this.editor.setValue(content)
    },
    /*
     * @description 移除编辑器值
     */
    remove: function () {
        document.getElementById(this.editor.vditor.id).outerHTML = ''
    },
})

admin.editors.articleEditor = {}
admin.editors.abstractEditor = {}
